package controladores;

import gamebook.Foto;
import gamebook.Paginacion;
import gamebook.Usuario;
import gamebook.UsuarioGenerico;
import gamebook.Utilidades;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 *
 * @author JAVA
 */
public class clientServlet extends HttpServlet {

    /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

        //Lista de errores que se devolverá a index en caso de que los haya
        List<String> mensajes = new ArrayList<String>();

        //Cogemos el valor de opcion
        String opcion = request.getParameter("opcion");
        //Ruta para cualquier sendRedirect
        String ruta = getServletContext().getContextPath();


        try {
            //Cogemos el número de la página que estamos (GET:pag)
            //si no hay o hay algún problema, es la primera página
            int pagina = Paginacion.cogePagDeGet(request.getParameter("pag"));


            if (opcion != null) {
                HttpSession sesion = request.getSession();
// ### Registro de un nuevo usuario ############################################
// #############################################################################
                if (opcion.equals("registro")) {

                    //Cogemos los parámetros de la petición
                    String nombre = request.getParameter("nombreReg");
                    String apellidos = request.getParameter("apellidosReg");
                    String mail = request.getParameter("correoReg");
                    String confirmaMail = request.getParameter("correoReg2");
                    String password = request.getParameter("passwordReg");
                    String sexo = request.getParameter("sexoReg");
                    //Creamos el Date de fecha de nacimiento, pero todavía está vacío
                    Date fNacimiento = null;

                    //Verificamos que los campos sean correctos
                    if (nombre.length() < 3) {
                        mensajes.add("El campo nombre esta mal introducido");
                    }
                    if (apellidos.length() < 4) {
                        mensajes.add("El campo apellidos esta mal introducido");
                    }

                    //Validación de los campos de mail
                    if (mail.length() > 0 && confirmaMail.length() > 0) {
                        if (mail.equals(confirmaMail)) {
                            //Set the email pattern string
                            Pattern p = Pattern.compile(".+@.+\\.[a-z]+");
                            //Match the given string with the pattern
                            Matcher m = p.matcher(mail);
                            //check whether match is found 
                            boolean matchFound = m.matches();
                            if (UsuarioGenerico.existeMail(mail)) {
                                //El mail ya existe
                                mensajes.add("El campo mail introducido ya esta en uso");
                            }
                            if (!matchFound) {
                                //No cumple con el patrón
                                mensajes.add("El campo mail esta mal introducido");
                            }
                        } else {
                            //No coinciden ambas entradas de mail
                            mensajes.add("Los campos de mail no coinciden");
                        }
                    } else {
                        //Campos de mail vacíós
                        mensajes.add("Los campos de mail no pueden estar vacios");
                    }

                    if (password.length() < 4) {
                        //Password demasiado pequeño
                        mensajes.add("La password debe de tener al menos 4 caracteres");
                    }

                    if (sexo.equals("")) {
                        //No se ha seleccionado sexo
                        mensajes.add("El campo sexo debe estar seleccionado");
                    }

                    //comprobacion de una fecha valida
                    int dia = Integer.parseInt(request.getParameter("diaReg"));
                    int mes = Integer.parseInt(request.getParameter("mesReg"));
                    int anyo = Integer.parseInt(request.getParameter("anyoReg"));
                    boolean esFechaValida = Utilidades.esFechaValida(dia, mes, anyo);
                    if (!esFechaValida) {
                        mensajes.add("La fecha introducida no es valida");
                    } else {
                        DateFormat dfm = new SimpleDateFormat("dd-MM-yyyy");
                        fNacimiento = dfm.parse(request.getParameter("diaReg") + "-" + request.getParameter("mesReg") + "-" + request.getParameter("anyoReg"));
                    }

                    //Si después de todas las comprobaciones hay algún error...
                    if (mensajes.size() > 0) {
                        //...metemos los errores en el request y devolvemos el control a index.jsp
                        request.setAttribute("mensajesRegistro", mensajes);
                        request.getRequestDispatcher("/index.jsp").forward(request, response);
                    } else {
                        //Si todo está bien creamos el usuario y le damos de alta
                        UsuarioGenerico usuario = new Usuario(nombre, apellidos, mail, fNacimiento, sexo, password, "");
                        boolean resultado = usuario.darAlta();

                        //Si hubo algún error al darle de alta, guardamos el error y volvemos a index
                        if (resultado) {
                            request.setAttribute("registroOk", "1");
                            request.getRequestDispatcher("/index.jsp").forward(request, response);
                            //Si todo ha ido bien, le ponemos como foto de perfil la imagen por defecto
            
                            //Cogemos la ruta donde se encuentra la imagen de perfil por defecto
                            File images = Utilidades.dameRuta(getServletContext().getRealPath("images"));

                            //Cogemos la ruta donde se guardarán las imágenes de perfil
                            File almacen = Utilidades.dameRuta(getServletContext().getRealPath("almacen"));

                            //Imagen por defecto
                            File imagenDefecto=new File(images,"0p.jpg");
                            //Imagen de perfil del usuario
                            File imagenPerfil=new File(almacen,usuario.getId()+"p.jpg");
                            //Imagen de perfil del usuario en miniatura
                            File imagenPerfilMin=new File(almacen,usuario.getId()+"pm.jpg");
                            
                            //Redimensionamos la imagen por defecto a 140x140 para usar de perfil
                            Utilidades.redimensionar(imagenDefecto, 140, 140, imagenPerfil);
                            
                            //Redimensionamos la imagen por defecto a 48x48 para usar de perfil en miniatura
                            Utilidades.redimensionar(imagenDefecto, 48, 48, imagenPerfilMin);
                            
                        } else {
                            mensajes.add("No se ha podido crear al usuario");
                            request.setAttribute("mensajesActualizacion", mensajes);
                            request.getRequestDispatcher("/index.jsp").forward(request, response);
                        }

                    }

// ### Actualiza los datos de un cliente #######################################
// #############################################################################
                } else if (opcion.equals("actualizacion")) {

                    //Cogemos los parámetros de la petición
                    String nombre = request.getParameter("nombreReg");
                    String apellidos = request.getParameter("apellidosReg");
                    String password = request.getParameter("passwordReg");
                    String password2 = request.getParameter("password2Reg");
                    String sexo = request.getParameter("sexoReg");
                    String localidad = request.getParameter("localidadReg");
                    //Creamos el Date de fecha de nacimiento, pero todavía está vacío
                    Date fNacimiento = null;

                    //Verificamos que los campos sean correctos
                    if (nombre.length() < 3) {
                        //Nombre demasiado pequeño
                        mensajes.add("El campo nombre esta mal introducido");
                    }

                    if (apellidos.length() < 4) {
                        //Apellidos demasiado pequeños
                        mensajes.add("El campo apellidos esta mal introducido");
                    }

                    if (password.length() < 4) {
                        //Password demasiado pequeño
                        mensajes.add("La password debe de tener al menos 4 caracteres");
                    }

                    if (!password.equals(password2)) {
                        //Passwords no iguales
                        mensajes.add("Los passwords no son iguales");
                    }

                    /* Vamos a dejar que no pongan la localidad si quieren
                    if (localidad.length() < 4) {
                        //Localidad demasiado pequeña
                        mensajes.add("La localidad debe de tener al menos 4 caracteres");
                    }
                    */
                    
                    //comprobacion de una fecha valida
                    int dia = Integer.parseInt(request.getParameter("diaReg"));
                    int mes = Integer.parseInt(request.getParameter("mesReg"));
                    int anyo = Integer.parseInt(request.getParameter("anyoReg"));
                    boolean esFechaValida = Utilidades.esFechaValida(dia, mes, anyo);
                    if (!esFechaValida) {
                        mensajes.add("La fecha introducida no es valida");
                    } else {
                        DateFormat dfm = new SimpleDateFormat("dd-MM-yyyy");
                        fNacimiento = dfm.parse(request.getParameter("diaReg") + "-" + request.getParameter("mesReg") + "-" + request.getParameter("anyoReg"));
                    }

                    //Si después de todas las comprobaciones hay algún error...
                    if (mensajes.size() > 0) {
                        //...metemos los errores en el request y devolvemos el control a perfil.jsp
                        request.setAttribute("mensajesRegistro", mensajes);
                        request.setAttribute("correcto", "false");
                        request.getRequestDispatcher("/perfil.jsp").forward(request, response);
                    } else {
                        //Si todo está bien actualizamos el usuario y volvemos a perfil.jsp con un mensaje de éxito
                        HttpSession session = request.getSession();
                        UsuarioGenerico usuario = (UsuarioGenerico) session.getAttribute("usuario");
                        usuario.setNombre(nombre);
                        usuario.setApellidos(apellidos);
                        if (!password.equals("*****")) { //Si el password introducido es distinto de *****
                            usuario.setPassword(password); //También lo actualizmos
                        }
                        usuario.setLocalidad(localidad);
                        usuario.setSexo(sexo);
                        usuario.setNacimiento(fNacimiento);
                        boolean resultado = usuario.actualizar();

                        //Si hubo algún error al actualizar, guardamos el error y volvemos a index
                        if (resultado) {
                            mensajes.add("Se han actualizado los datos.");
                            request.setAttribute("mensajesRegistro", mensajes);
                            request.setAttribute("correcto", "true");
                            request.getRequestDispatcher("/perfil.jsp").forward(request, response);
                        } else {
                            mensajes.add("No se ha podido actualizar al usuario");
                            request.setAttribute("mensajesRegistro", mensajes);
                            request.setAttribute("correcto", "false");
                            request.getRequestDispatcher("/perfil.jsp").forward(request, response);
                        }

                    }








// ### Ir a la página de Gente #################################################
// #############################################################################
                } else if (opcion.equals("irAGente")) {

                    UsuarioGenerico usuarioSesion = (UsuarioGenerico) sesion.getAttribute("usuario");
                    Paginacion p = new Paginacion(UsuarioGenerico.USUXPAG, UsuarioGenerico.cuentaUsuarios(usuarioSesion, "", 1), pagina);
                    List<UsuarioGenerico> usuarios = UsuarioGenerico.getUsuariosGenericosPorNombre("", usuarioSesion, false, p.offset(), p.getRegistrosPorPagina());
                    //usuarios = usuarioSesion.filtraUsuarioSesion(usuarios); 
                    request.setAttribute("paginacionUsuarios", p);
                    request.setAttribute("listaUsuarios", usuarios);
                    request.getRequestDispatcher("/gente.jsp").forward(request, response);
                    
                } else if (opcion.equals("busquedaGamebookFiltro")) {
                    if (request.getParameter("criterioBusqueda").equals("misAmigos")) {
                        String nombreApellidos = request.getParameter("rastreador");
                        if (nombreApellidos != null) {
                            UsuarioGenerico usuarioSesion = (UsuarioGenerico) sesion.getAttribute("usuario");
                            Paginacion p = new Paginacion(UsuarioGenerico.USUXPAG, UsuarioGenerico.cuentaUsuarios(usuarioSesion, nombreApellidos, 2), pagina);
                            List<UsuarioGenerico> usuarios = UsuarioGenerico.getUsuariosGenericosPorNombre(nombreApellidos, usuarioSesion, true, p.offset(), p.getRegistrosPorPagina());
                            //usuarios = usuarioSesion.filtraUsuarioSesion(usuarios); 
                            request.setAttribute("listaUsuarios", usuarios);
                            request.setAttribute("paginacionUsuarios", p);
                            request.getRequestDispatcher("/gente.jsp").forward(request, response);
                        }
                    } else if (request.getParameter("criterioBusqueda").equals("todoGamebook")) {
                        String nombreApellidos = request.getParameter("rastreador");
                        if (nombreApellidos != null) {

                            UsuarioGenerico usuarioSesion = (UsuarioGenerico) sesion.getAttribute("usuario");
                            Paginacion p = new Paginacion(UsuarioGenerico.USUXPAG, UsuarioGenerico.cuentaUsuarios(usuarioSesion, nombreApellidos, 1), pagina);
                            List<UsuarioGenerico> usuarios = UsuarioGenerico.getUsuariosGenericosPorNombre(nombreApellidos, usuarioSesion, false, p.offset(), p.getRegistrosPorPagina());
                            //usuarios = usuarioSesion.filtraUsuarioSesion(usuarios); 
                            request.setAttribute("listaUsuarios", usuarios);
                            request.setAttribute("paginacionUsuarios", p);
                            request.getRequestDispatcher("/gente.jsp").forward(request, response);
                        }
                    }
                }
            }



        } catch (Exception e) {
            out.println("Error: Client Servlet " + e.getMessage());
        } finally {
            out.close();
        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}
